package com.qoq.test.chapter3;

/**
 * VM参数：-verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:+PrintGCDetails
 * -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=1 -XX:+UseSerialGC
 * -XX:+PrintTenuringDistribution
 *
 * 对象在Survivor区中每熬过一次Minor GC，年龄就增加1岁，当它的年龄增加到一定程度（默认为15），就会被晋升到老年代中。
 * 对象晋升老年代的年龄阈值，可以通过参数-XX：MaxTenuringThreshold设置。
 *
 * 用jdk8测试没有出现15的情况，始终会晋升到老年代
 */
public class LongLive2Old {
    private static final int _1MB = 1024 * 1024;

    @SuppressWarnings("unused")
    public static void testTenuringThreshold() {
        byte[] allocation1, allocation2, allocation3;
        allocation1 = new byte[_1MB / 4];   // 什么时候进入老年代决定于XX:MaxTenuringThreshold设置
        allocation2 = new byte[4 * _1MB];
        allocation3 = new byte[4 * _1MB];   // 8M的eden放不下，allocation1->s0, allocation2->old, allocation3->eden
        allocation3 = null; // allocation3可以被gc
        allocation3 = new byte[4 * _1MB];   // eden不够，老的allocation3回收，新的allocation3放在eden，s0->old
    }

    public static void main(String[] args) {
        testTenuringThreshold();
    }
}
